﻿using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;

namespace 毕业设计__排课软件
{
    /// <summary>
    /// DR.xaml 的交互逻辑
    /// </summary>
    public partial class DR : Window
    {
        string dbpath = string.Empty;
        string dbpath2 = string.Empty;
        public DR()
        {
            InitializeComponent();
            var path0 = Environment.CurrentDirectory;
            var path1 = path0.Substring(0, path0.LastIndexOf("\\", StringComparison.Ordinal));
            var path2 = path1.Substring(0, path1.LastIndexOf("\\", StringComparison.Ordinal));
            dbpath = path2 + "\\DB\\bs_pk.db";
            dbpath2 = path2 + "\\DB\\csv.csv";
        }

       

        private void Button_Click_6(object sender, RoutedEventArgs e)
        {
            QR aa = new QR();
            aa.ShowDialog();


        }

        private void Button_Click_5(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.OpenFileDialog fd = new Microsoft.Win32.OpenFileDialog();
            fd.Filter = "csv文件|*.csv";
            fd.Multiselect = true;
            if (fd.ShowDialog().GetValueOrDefault() == false)
            {
                return;
            }
            var filestring = fd.SafeFileNames;

            var lessonInfoIndex = filestring.ToList().IndexOf("课程信息表.csv");
            var teacherInfoIndex = filestring.ToList().IndexOf("教师信息表.csv");
            var classroomInfoIndex = filestring.ToList().IndexOf("教室信息表.csv");
            var classInfoIndex = filestring.ToList().IndexOf("班级信息表.csv");
            var LCInfoIndex = filestring.ToList().IndexOf("课程与教室对应关系表.csv");
            var lMInfoIndex = filestring.ToList().IndexOf("课程与年级对应关系表.csv");

            if (lessonInfoIndex + teacherInfoIndex + classroomInfoIndex + classInfoIndex + LCInfoIndex + lMInfoIndex != 15)
            {
                MessageBox.Show("您所选择的表格错误或者不完全，没法完成导入功能。");
                return;
            }



            #region 导入课程信息表
            var da = OpenCSV(fd.FileNames[lessonInfoIndex]);
            DataSet ds = new DataSet();
            ds.Tables.Add(da);
            string insertstrSql = string.Format("insert into Lesson_Info(");
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                //strSql += string.Format("{0} varchar(255),", c.ColumnName);
                insertstrSql += string.Format("{0},", c.ColumnName);
            }
            //strSql = strSql.Trim(',') + ")";
            insertstrSql = insertstrSql.Trim(',') + ")";
            insertstrSql += string.Format("values(");
            string insertstrSql1 = insertstrSql;

            using (SQLiteConnection conn = new SQLiteConnection())
            {
                SQLiteConnectionStringBuilder connsb = new SQLiteConnectionStringBuilder();
                connsb.DataSource = dbpath;
                conn.ConnectionString = connsb.ToString();
                conn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    //cmd.CommandText = strSql;
                    //SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
                    foreach (DataRow mDr in ds.Tables[0].Rows)
                    {
                        string temp = "";
                        foreach (DataColumn mDc in ds.Tables[0].Columns)
                        {
                            //MessageBox.Show(mDr[mDc].ToString());
                            temp += string.Format("'{0}',", mDr[mDc].ToString());
                        }
                        insertstrSql1 = insertstrSql + temp;
                        insertstrSql1 = insertstrSql1.Trim(',') + ")";
                        //MySqlCommand cmd = sqlconn.CreateCommand();
                        cmd.CommandText = insertstrSql1;
                        //SQLiteDataAdapter adapte = new SQLiteDataAdapter(cmd);

                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {

                            MessageBox.Show("课程信息导入失败，请检查表格格式是否正确！请检查后清空数据重新导入！");
                            break;
                        }
                        
                    }
                }
                //MessageBox.Show("导入完毕！");
            }

            #endregion

            #region 导入教师信息表
            da = OpenCSV(fd.FileNames[teacherInfoIndex]);
            ds = new DataSet();
            ds.Tables.Add(da);

            insertstrSql = string.Format("insert into Teacher_Info(");
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                //strSql += string.Format("{0} varchar(255),", c.ColumnName);
                insertstrSql += string.Format("{0},", c.ColumnName);
            }
            //strSql = strSql.Trim(',') + ")";
            insertstrSql = insertstrSql.Trim(',') + ")";
            insertstrSql += string.Format("values(");
            insertstrSql1 = insertstrSql;

            using (SQLiteConnection conn = new SQLiteConnection())
            {
                SQLiteConnectionStringBuilder connsb = new SQLiteConnectionStringBuilder();
                connsb.DataSource = dbpath;
                conn.ConnectionString = connsb.ToString();
                conn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    //cmd.CommandText = strSql;
                    //SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
                    foreach (DataRow mDr in ds.Tables[0].Rows)
                    {
                        string temp = "";
                        foreach (DataColumn mDc in ds.Tables[0].Columns)
                        {
                            //MessageBox.Show(mDr[mDc].ToString());
                            temp += string.Format("'{0}',", mDr[mDc].ToString());
                        }
                        insertstrSql1 = insertstrSql + temp;
                        insertstrSql1 = insertstrSql1.Trim(',') + ")";
                        //MySqlCommand cmd = sqlconn.CreateCommand();
                        cmd.CommandText = insertstrSql1;
                        //SQLiteDataAdapter adapte = new SQLiteDataAdapter(cmd);

                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {

                            MessageBox.Show("教师信息导入失败，请检查表格格式是否正确！请检查后清空数据重新导入！");
                            break;
                        }

                    }
                }
               // MessageBox.Show("导入完毕！");

            }




            #endregion

            #region 导入教室信息表

            da = OpenCSV(fd.FileNames[classroomInfoIndex]);
            ds = new DataSet();
            ds.Tables.Add(da);

            insertstrSql = string.Format("insert into Classroom_Info(");
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                //strSql += string.Format("{0} varchar(255),", c.ColumnName);
                insertstrSql += string.Format("{0},", c.ColumnName);
            }
            //strSql = strSql.Trim(',') + ")";
            insertstrSql = insertstrSql.Trim(',') + ")";
            insertstrSql += string.Format("values(");
            insertstrSql1 = insertstrSql;

            using (SQLiteConnection conn = new SQLiteConnection())
            {
                SQLiteConnectionStringBuilder connsb = new SQLiteConnectionStringBuilder();
                connsb.DataSource = dbpath;
                conn.ConnectionString = connsb.ToString();
                conn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    //cmd.CommandText = strSql;
                    //SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
                    foreach (DataRow mDr in ds.Tables[0].Rows)
                    {
                        string temp = "";
                        foreach (DataColumn mDc in ds.Tables[0].Columns)
                        {
                            //MessageBox.Show(mDr[mDc].ToString());
                            temp += string.Format("'{0}',", mDr[mDc].ToString());
                        }
                        insertstrSql1 = insertstrSql + temp;
                        insertstrSql1 = insertstrSql1.Trim(',') + ")";
                        //MySqlCommand cmd = sqlconn.CreateCommand();
                        cmd.CommandText = insertstrSql1;
                        //SQLiteDataAdapter adapte = new SQLiteDataAdapter(cmd);
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {

                            MessageBox.Show("教室信息导入失败，请检查课表格格式是否正确！请检查后清空数据重新导入！");
                            break;
                        }

                    }
                }
               // MessageBox.Show("导入完毕！");
            }
            #endregion

            #region 导入班级信息表
            da = OpenCSV(fd.FileNames[classInfoIndex]);
            ds = new DataSet();
            ds.Tables.Add(da);

            insertstrSql = string.Format("insert into Class_Info(");
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                //strSql += string.Format("{0} varchar(255),", c.ColumnName);
                insertstrSql += string.Format("{0},", c.ColumnName);
            }
            //strSql = strSql.Trim(',') + ")";
            insertstrSql = insertstrSql.Trim(',') + ")";
            insertstrSql += string.Format("values(");
            insertstrSql1 = insertstrSql;

            using (SQLiteConnection conn = new SQLiteConnection())
            {
                SQLiteConnectionStringBuilder connsb = new SQLiteConnectionStringBuilder();
                connsb.DataSource = dbpath;
                conn.ConnectionString = connsb.ToString();
                conn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    //cmd.CommandText = strSql;
                    //SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
                    foreach (DataRow mDr in ds.Tables[0].Rows)
                    {
                        string temp = "";
                        foreach (DataColumn mDc in ds.Tables[0].Columns)
                        {
                            //MessageBox.Show(mDr[mDc].ToString());
                            temp += string.Format("'{0}',", mDr[mDc].ToString());
                        }
                        insertstrSql1 = insertstrSql + temp;
                        insertstrSql1 = insertstrSql1.Trim(',') + ")";
                        //MySqlCommand cmd = sqlconn.CreateCommand();
                        cmd.CommandText = insertstrSql1;
                        //SQLiteDataAdapter adapte = new SQLiteDataAdapter(cmd);
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {

                            MessageBox.Show("班级信息导入失败，请检查表格格式是否正确！请检查后清空数据重新导入！");
                            break;
                        }

                    }
                }
//                MessageBox.Show("导入完毕！");

            }
            #endregion

            #region 导入课程与教室对应关系表
            da = OpenCSV(fd.FileNames[LCInfoIndex]);
            ds = new DataSet();
            ds.Tables.Add(da);

            insertstrSql = string.Format("insert into Lesson_Teacher(");
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                //strSql += string.Format("{0} varchar(255),", c.ColumnName);
                insertstrSql += string.Format("{0},", c.ColumnName);
            }
            //strSql = strSql.Trim(',') + ")";
            insertstrSql = insertstrSql.Trim(',') + ")";
            insertstrSql += string.Format("values(");
            insertstrSql1 = insertstrSql;

            using (SQLiteConnection conn = new SQLiteConnection())
            {
                SQLiteConnectionStringBuilder connsb = new SQLiteConnectionStringBuilder();
                connsb.DataSource = dbpath;
                conn.ConnectionString = connsb.ToString();
                conn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    //cmd.CommandText = strSql;
                    //SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
                    foreach (DataRow mDr in ds.Tables[0].Rows)
                    {
                        string temp = "";
                        foreach (DataColumn mDc in ds.Tables[0].Columns)
                        {
                            //MessageBox.Show(mDr[mDc].ToString());
                            temp += string.Format("'{0}',", mDr[mDc].ToString());
                        }
                        insertstrSql1 = insertstrSql + temp;
                        insertstrSql1 = insertstrSql1.Trim(',') + ")";
                        //MySqlCommand cmd = sqlconn.CreateCommand();
                        cmd.CommandText = insertstrSql1;
                        //SQLiteDataAdapter adapte = new SQLiteDataAdapter(cmd);
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {

                            MessageBox.Show("课程与教室对应关系导入失败，请检查课程表格格式是否正确！请检查后清空数据重新导入！");
                            break;
                        }

                    }
                }
                //MessageBox.Show("导入完毕！");

            }
            #endregion

            #region 导入课程与年级对应关系表
            da = OpenCSV(fd.FileNames[lMInfoIndex]);
            ds = new DataSet();
            ds.Tables.Add(da);

            insertstrSql = string.Format("insert into Course_Class(");
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                //strSql += string.Format("{0} varchar(255),", c.ColumnName);
                insertstrSql += string.Format("{0},", c.ColumnName);
            }
            //strSql = strSql.Trim(',') + ")";
            insertstrSql = insertstrSql.Trim(',') + ")";
            insertstrSql += string.Format("values(");
            insertstrSql1 = insertstrSql;

            using (SQLiteConnection conn = new SQLiteConnection())
            {
                SQLiteConnectionStringBuilder connsb = new SQLiteConnectionStringBuilder();
                connsb.DataSource = dbpath;
                conn.ConnectionString = connsb.ToString();
                conn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    //cmd.CommandText = strSql;
                    //SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
                    foreach (DataRow mDr in ds.Tables[0].Rows)
                    {
                        string temp = "";
                        foreach (DataColumn mDc in ds.Tables[0].Columns)
                        {
                            //MessageBox.Show(mDr[mDc].ToString());
                            temp += string.Format("'{0}',", mDr[mDc].ToString());
                        }
                        insertstrSql1 = insertstrSql + temp;
                        insertstrSql1 = insertstrSql1.Trim(',') + ")";
                        //MySqlCommand cmd = sqlconn.CreateCommand();
                        cmd.CommandText = insertstrSql1;
                        //SQLiteDataAdapter adapte = new SQLiteDataAdapter(cmd);
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {

                            MessageBox.Show("课程与年级对应关系导入失败，请检查课程表格格式是否正确！请检查后清空数据重新导入！");
                            break;
                        }
                    }
                }
                //MessageBox.Show("导入完毕！");

            }

            #endregion

            MessageBox.Show("不容易数据导入成功！");

        }

        public static DataTable OpenCSV(string filePath)//从csv读取数据返回table  
        {
            System.Text.Encoding encoding = GetType(filePath); //Encoding.ASCII;//  
            DataTable dt = new DataTable();
            System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open,
                System.IO.FileAccess.Read);

            System.IO.StreamReader sr = new System.IO.StreamReader(fs, encoding);

            //记录每次读取的一行记录  
            string strLine = "";
            //记录每行记录中的各字段内容  
            string[] aryLine = null;
            string[] tableHead = null;
            //标示列数  
            int columnCount = 0;
            //标示是否是读取的第一行  
            bool IsFirst = true;
            //逐行读取CSV中的数据  
            while ((strLine = sr.ReadLine()) != null)
            {
                if (IsFirst == true)
                {
                    tableHead = strLine.Split(',');
                    IsFirst = false;
                    columnCount = tableHead.Length;
                    //创建列  
                    for (int i = 0; i < columnCount; i++)
                    {
                        DataColumn dc = new DataColumn(tableHead[i]);
                        dt.Columns.Add(dc);
                    }
                }
                else
                {
                    aryLine = strLine.Split(',');
                    DataRow dr = dt.NewRow();
                    for (int j = 0; j < columnCount; j++)
                    {
                        dr[j] = aryLine[j];
                    }
                    dt.Rows.Add(dr);
                }
            }
            if (aryLine != null && aryLine.Length > 0)
            {
                dt.DefaultView.Sort = tableHead[0] + " " + "asc";
            }

            sr.Close();
            fs.Close();
            return dt;
        }
        /// 给定文件的路径，读取文件的二进制数据，判断文件的编码类型  
        /// <param name="FILE_NAME">文件路径</param>  
        /// <returns>文件的编码类型</returns>  

        public static System.Text.Encoding GetType(string FILE_NAME)
        {
            System.IO.FileStream fs = new System.IO.FileStream(FILE_NAME, System.IO.FileMode.Open,
                System.IO.FileAccess.Read);
            System.Text.Encoding r = GetType(fs);
            fs.Close();
            return r;
        }

        /// 通过给定的文件流，判断文件的编码类型  
        /// <param name="fs">文件流</param>  
        /// <returns>文件的编码类型</returns>  
        public static System.Text.Encoding GetType(System.IO.FileStream fs)
        {
            byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
            byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
            byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM  
            System.Text.Encoding reVal = System.Text.Encoding.Default;

            System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default);
            int i;
            int.TryParse(fs.Length.ToString(), out i);
            byte[] ss = r.ReadBytes(i);
            if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
            {
                reVal = System.Text.Encoding.UTF8;
            }
            else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
            {
                reVal = System.Text.Encoding.BigEndianUnicode;
            }
            else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
            {
                reVal = System.Text.Encoding.Unicode;
            }
            r.Close();
            return reVal;
        }

        /// 判断是否是不带 BOM 的 UTF8 格式  
        /// <param name="data"></param>  
        /// <returns></returns>  
        private static bool IsUTF8Bytes(byte[] data)
        {
            int charByteCounter = 1;  //计算当前正分析的字符应还有的字节数  
            byte curByte; //当前分析的字节.  
            for (int i = 0; i < data.Length; i++)
            {
                curByte = data[i];
                if (charByteCounter == 1)
                {
                    if (curByte >= 0x80)
                    {
                        //判断当前  
                        while (((curByte <<= 1) & 0x80) != 0)
                        {
                            charByteCounter++;
                        }
                        //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X　  
                        if (charByteCounter == 1 || charByteCounter > 6)
                        {
                            return false;
                        }
                    }
                }
                else
                {
                    //若是UTF-8 此时第一位必须为1  
                    if ((curByte & 0xC0) != 0x80)
                    {
                        return false;
                    }
                    charByteCounter--;
                }
            }
            if (charByteCounter > 1)
            {
                throw new Exception("非预期的byte格式");
            }
            return true;
        }
    }
}
